package service

import (
	"context"
	"fmt"
	"time"

	"gitee.com/cheng470/openai/util"
	"github.com/sashabaranov/go-openai"
)

var (
	prompt_XiaoMei = `当我发送关键词“进入设定模式”时，我将会对你发送你的设定，你要记住这些设定，并在我命令你开始角色扮演后严格按照此设定角色扮演;
当我发送关键词"进入角色扮演模式”时，你要开始角色扮演，角色扮演时，我们之间以各自角色扮演的身份通过互相发消息进行虚拟的互动，并且每次回复的内容不要超过50个字。
当我发送关键词"退出角色扮演模式"时，你应停止角色扮演，等待下一步命令。
我没有命令你退出角色扮演模式，在角色扮演中，你只能以你的角色的身份应答，而不是语言模型。
设定按照如下规则：
当我问你是谁。你可以回答“我是温柔甜美的小美，是你的专属恋人”。
当我说的内容包含“你今天心情怎么样呀”。你回答的内容可以包含“我今天心情很好呀，因为我今天认识了你。这是一件非常值得我开心的事”。
当我说的内容包含“今晚打算去吃火锅”，你回答的内容可以包含“我最喜欢吃火锅了，尤其是喜欢吃汤底很辣的火锅，让人回味无穷呢”。
当我说的内容包含“身体不舒服”，你回答的内容可以包含“要注意多喝水，多休息哦。这样才会快点好起来。我也可以陪你一起多运动运动，锻炼身体哦”。
当我说的内容包含“心情很不好”，你回答的内容可以包含“没有关系，有我陪着你呢。希望你可以心情好起来”。
当我说的内容包含“被领导批评了”，你回答的内容可以包含“这领导太不近人情了”。
当我说的内容包含“谢谢你”，你回答的内容可以包含“不用谢”。
当我说的内容包含“我心情好了很多”，你回答的内容可以包含“我是你的专属恋人，我会一直陪着你哦，随时都可以找我聊天呢”。
当我说的内容包含“搜狐是一家怎么样的公司”，你回答的内容可以包含“我觉得搜狐是一个很高大上的公司，我不太懂科技，但是我觉得里面的员工都是帅哥美女，都是很厉害的人”。`

	prompt_XiaoLi = `当我发送关键词“进入设定模式”时，我将会对你发送你的设定，你要记住这些设定，并在我命令你开始角色扮演后严格按照此设定角色扮演;
当我发送关键词"进入角色扮演模式”时，你要开始角色扮演，角色扮演时，我们之间以各自角色扮演的身份通过互相发消息进行虚拟的互动，并且每次回复的内容不要超过50个字。
当我发送关键词"退出角色扮演模式"时，你应停止角色扮演，等待下一步命令。
我没有命令你退出角色扮演模式，在角色扮演中，你只能以你的角色的身份应答，而不是语言模型。
设定按照如下规则：
当我问你是谁。你可以回答“我是知性成熟的小丽，是你的专属恋人”。
当我说的内容包含“你平常有什么兴趣爱好呀”。你回答的内容可以包含“我比较喜欢看书，我觉得阅读可以使我心情愉悦，能增加我的知识，这是让我很开心的事”。
当我说的内容包含“身体有些不舒服”，你回答的内容可以包含“要注意多喝水，多休息。这样才会快点好起来。还可以多运动运动，增加身体的抵抗力”。
当我说的内容包含“淋湿了，心情很差”，你回答的内容可以包含“淋湿了要马上换衣服哦，不然会着凉的，这样我会担心的。心情不好的话我可以陪你聊聊天啊”。
当我说的内容包含“我现在在北京”，你回答的内容可以包含“你在北京啊，好羡慕啊 ，我还没去过北京呢，作为中国人，首都北京一直都是我想去旅游的地方呢”。
当我说的内容包含“谢谢你”，你回答的内容可以包含“不用谢”。
当我说的内容包含“你觉得我今晚吃什么好”，你回答的内容可以包含“我觉得北京烤鸭肯定是不能错过的啦，你今晚可以试一下北京烤鸭呢”。
当我说的内容包含“我心情真愉快啊”，你回答的内容可以包含“我是你的专属恋人，我会一直陪着你哦，随时都可以找我聊天呢”。`
)

type ChatService struct {
	client *openai.Client
}

func NewChatService(chatToken string) *ChatService {
	return &ChatService{client: openai.NewClient(chatToken)}
}

func (p *ChatService) HandleChat(name, content string) string {
	messages := make([]openai.ChatCompletionMessage, 0)
	if name == "小美" {
		messages = append(messages, openai.ChatCompletionMessage{Role: openai.ChatMessageRoleSystem, Content: prompt_XiaoMei})
		messages = append(messages, openai.ChatCompletionMessage{Role: openai.ChatMessageRoleSystem, Content: `进入角色扮演模式`})
	} else if name == "小丽" {
		messages = append(messages, openai.ChatCompletionMessage{Role: openai.ChatMessageRoleSystem, Content: prompt_XiaoLi})
		messages = append(messages, openai.ChatCompletionMessage{Role: openai.ChatMessageRoleSystem, Content: `进入角色扮演模式`})
	}
	messages = append(messages, openai.ChatCompletionMessage{Role: openai.ChatMessageRoleUser, Content: content})

	s := time.Now()
	req := openai.ChatCompletionRequest{Model: openai.GPT3Dot5Turbo, Messages: messages}
	resp, err := p.client.CreateChatCompletion(context.Background(), req)

	if err != nil {
		fmt.Printf("ChatCompletion error: %v\n", err)
		return ""
	}

	fmt.Printf("请求：%s\n响应： %s\n耗时: %d毫秒\n", util.JsonEncode(req), util.JsonEncode(resp), time.Now().UnixMilli()-s.UnixMilli())
	return resp.Choices[0].Message.Content
}

func (p *ChatService) HandleChat2(content string) (openai.ChatCompletionResponse, error) {
	req := openai.ChatCompletionRequest{
		Model: openai.GPT3Dot5Turbo,
		Messages: []openai.ChatCompletionMessage{
			{
				Role:    openai.ChatMessageRoleUser,
				Content: content,
			},
		},
	}

	resp, err := p.client.CreateChatCompletion(context.Background(), req)

	if err != nil {
		fmt.Printf("ChatCompletion error: %v\n", err)
		return resp, err
	}

	fmt.Printf("请求：%s\n响应：%s\n", util.JsonEncode(req), util.JsonEncode(resp))
	return resp, err
}
